// 安装包依赖
var gulp = require('gulp');                 // 引入gulp工具
var uglify = require('gulp-uglify');        // js 压缩
var cssUglify= require('gulp-minify-css'); // css压缩
var imagemin = require('gulp-imagemin');        // 图片压缩
var clean = require('gulp-clean');          // 清空文件夹
var gutil = require('gulp-util');             // 输出js代码报错位置
var gulpIf = require("gulp-if");              // 条件判断
var path = require('path');                   //获取 /路径/文件名/扩展名
var watch = require('gulp-watch');            //监控文件
var runSequence = require('run-sequence');    //逐条执行
var rev = require('gulp-rev-dxb');	        // 生成版本号清单
var revCollector = require('gulp-rev-collector-dxb');   // 替换成版本号文件
// 上传依赖
var Oss = require('ali-oss');
var fs = require('fs');


// 初始化文件地址
var staticJs='./static/js';
var staticDisJs='./static_dist/js/';
var staticCss='./static/css';
var staticDisCss='./static_dist/css/';
var staticImg='./static/img';
var staticDisImg='./static_dist/img/';
var staticFont='./static/font';
var staticDisFont='./static_dist/font/';

//打包HTML(ceshi)
// 打包html
gulp.task('html', function(){
    return gulp.src('./huati/**/*.html')
        .pipe(gulp.dest('./static_dist/huati'));
});

// 打包js
gulp.task('js',function () {
    // 带有.min的js文件不压缩
    var minjs=function (file) {
        if(file.path.indexOf('.min')<0){
            return true
        }
        return false
    }
    return gulp.src(staticJs+'/**/*.js')
        .pipe(gulpIf(minjs,uglify()))
        .pipe(gulp.dest(staticDisJs))
});

//打包css
gulp.task('css',function () {
    // 带有.min的js文件不压缩
    var mincss=function (file) {
        if(file.path.indexOf('.min')<0){
            return true
        }
        return false
    }
    return gulp.src(staticCss+'/**/*.css')
        .pipe(gulpIf(mincss,cssUglify()))// 压缩优化css
        .pipe(gulp.dest(staticDisCss))
})

//打包图片
gulp.task('img', function () {
    return gulp.src(staticImg + '/*.*')
        .pipe(imagemin({progressive: true,
        }))
        .pipe(gulp.dest(staticDisImg));
})

//复制字体文件（暂无打包）
gulp.task('font', function () {
    return gulp.src(staticFont+'/**/*')
        .pipe(gulp.dest(staticDisFont));
})

// 添加版本号（路径替换）
gulp.task('add_version', function() {
return gulp.src(['../public/manifest.json', './**/*.html'])
    .pipe(revCollector())           // 根据.json文件 执行文件内js/css名的替换
    .pipe(gulp.dest('./static_dist'));
});

// 生成版本号清单
gulp.task('rev', function() {
    return gulp.src([staticJs+'/**/*.js', staticCss+'/**/*.css'])
        .pipe(rev())
        .pipe(rev.manifest())
        .pipe(gulp.dest("./public"));
});

// 监听文件改变、新增、删除
gulp.task('watch', function () {
    // 监控文件的内容变化
    gulp.watch(staticCss,['css']);
    gulp.watch(staticJs, ['js']);
    gulp.watch(staticImg, ['img']);
    // 监控文件的新增和删除
    w(staticJs+'/**', 'js');
    w(staticCss+'/**', 'css');
    w(staticImg+'/**', 'img');
    function w(path, task){
        watch(path, function () {
            gulp.start(task);
        });
    }
});

// 文件拷贝
gulp.task('copy',['rev'],function() {// 先生成清单，然后copy一份
    return gulp.src('./public/rev-manifest.json')
    .pipe(gulp.dest('./'));
});

// 上传到阿里云指定地址
const client = new Oss({
    region: 'oss-cn-shenzhen',
    accessKeyId: 'LTAIUNqjWlPTiz1Z',
    accessKeySecret: 'lHvccEGQmnDyKkZRi2WVYEEJCfdm0j',
    bucket: 'huakai-static-test'
});

// 文件上传
gulp.task('oss', function(cb){
    doUploads('./static_dist/css/',"/testYL/css/");//上传css
    doUploads('./static_dist/js/',"/testYL/js/");//上传js
});
var doUploads = function (url,prefix) {;
    const root = path.resolve(__dirname, url);
    const files = [];
    //递归取出所有文件夹下所有文件的路径
    var listDir = function (dir) {
        const pa = fs.readdirSync(dir);
        pa.forEach(function (filename) {
            var fullpath = path.join(dir, filename);
            const info = fs.statSync(fullpath);
            if (info.isDirectory()) {
                listDir(fullpath);
            } else {
                files.push(fullpath);
            }
        });
    }
    var putAll = function () {
        //遍历文件
        for (let index = 0; index < files.length; index += 1) {
            const e = files[index];
            const result = client.put(e.replace(root+'\\', prefix), e);
            console.log(result)
        }
    };
    listDir(root);
    putAll();
}
// 上传变化的文件
gulp.task('change',['rev'],function () {
    init()
})
function init() {
    var newJson=require('./public/rev-manifest')
    var oldJson=require('./rev-manifest');
    var changejson=[];
    for(var newKey in newJson){
        if(!oldJson[newKey] || newJson[newKey] != oldJson[newKey]){
            changejson.push(newJson[newKey]);
        }
    }
    console.log(changejson)
    for(var i=0;i<changejson.length;i++){
        if(changejson[i].indexOf('.js?v=')>-1){
            var jsvalue=changejson[i];
            changeFile('./static_dist/js',"/testYL/js/",jsvalue)
        }else if(changejson[i].indexOf('.css?v=')>-1){
            var cssvalue=changejson[i];
            changeFile('./static_dist/css',"/testYL/css/",cssvalue)
        }
    }
}

function changeFile(url,prefix,changejson){
    var root = path.resolve(__dirname, url);
    var e1=changejson.split("?")[0];
    var prefix = prefix+e1;//文件前缀
    var e=root+'\\'+e1;
    client.put(prefix,e);
}
// 清空dist文件夹
gulp.task('clean', function(){
    return gulp.src(['./static_dist/*','./public/','./rev-manifest.json'])
        .pipe(clean());
});
// // 按顺序执行task
gulp.task('default', function(cb) {
    runSequence(
        ['clean'],// 首先清理文件，否则会把新打包的文件清掉
        ['js','css'],//js和css 压缩
        ['copy'], //不分先后的任务最好并行执行，提高效率
        ['watch'],// 所有文件打包完毕之后启动服务打开浏览器
    cb);
});


